package trunk.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

@SuppressWarnings("serial")
public class BancoDeConvidados implements Serializable, Iterable<Convidado> {

	private List<Convidado> bancoDeConvidados;

	public BancoDeConvidados() {
		bancoDeConvidados = new ArrayList<Convidado>();
		Collections.sort(bancoDeConvidados);
	}

	public BancoDeConvidados(BancoDeConvidados novoBanco) {
		bancoDeConvidados = new ArrayList<Convidado>();
		bancoDeConvidados.addAll(novoBanco.getBancoDeConvidados());
		Collections.sort(bancoDeConvidados);
	}
	
	public BancoDeConvidados(BancoDeClientes novoBanco) {
		bancoDeConvidados = new ArrayList<Convidado>();
		for(Cliente cliente:novoBanco){
			Convidado novoConvidado = new Convidado(cliente.getNome(), cliente.getEmail());
			bancoDeConvidados.add(novoConvidado);
		}
		Collections.sort(bancoDeConvidados);
	}

	public boolean inserirCliente(Convidado novoCliente) { // insere cliente na lista
		if (!contem(novoCliente)) {
			return bancoDeConvidados.add(novoCliente);
		} else {
			return false;
		}
	}
	
	public boolean inserirClientes(BancoDeConvidados clientes){
		return bancoDeConvidados.addAll(clientes.bancoDeConvidados);
	}

	public boolean excluirCliente(Convidado pessoa) { //Exclui cliente da lista de clientes

		for (Convidado aux : bancoDeConvidados) {
			if (aux.getEmail().equals(pessoa.getEmail())) {
				bancoDeConvidados.remove(aux);

				return true;
			}
		}
		return false;
	}    

	public boolean excluirClientes(BancoDeConvidados clientes) { //Exclui cliente da lista de clientes
		return bancoDeConvidados.removeAll(clientes.bancoDeConvidados);
	}

	public boolean contem(Convidado pessoa) { //Busca cliente na lista de clientes
		for (Convidado aux : bancoDeConvidados) {
			if (aux.getEmail().equals(pessoa.getEmail())) {
				return true;
			}
		}
		return false;
	}
	
	public boolean setStatusConvidado(Convidado cliente){
		for (Convidado aux : bancoDeConvidados) {
			if (aux.getEmail().equals(cliente.getEmail())) {
				Convidado novoCliente = new Convidado(aux.getNome(), aux.getEmail());
				novoCliente.setStatus(cliente.getStatus());
				bancoDeConvidados.remove(aux);
				bancoDeConvidados.add(novoCliente);
				return true;
			}
		}
		return false;
	}
	
	public boolean isConvidadoPendente(Cliente cliente){
		for(Convidado convidado:bancoDeConvidados)
			if(convidado.getEmail().equals(cliente.getEmail())
					&& convidado.getStatus() == TipoStatusConvidado.PENDENTE)
				return true;
		return false;
	}
	
	public int getNumeroConfirmados(){
		int confirmados = 0;
		for(Convidado convidado:bancoDeConvidados)
			if(convidado.getStatus()==TipoStatusConvidado.CONFIRMADO)
				confirmados++;
		return confirmados;
	}

	public Convidado getConvidado(String email) {
		for (Convidado cliente : bancoDeConvidados) {
			if (cliente.getEmail().equals(email)) {
				return cliente;
			}
		}
		return null;
	}

	public List<Convidado> getBancoDeConvidados() {
		return bancoDeConvidados;
	}

	@Override
	public Iterator<Convidado> iterator() {
		return bancoDeConvidados.iterator();
	}

	public int size() {
		return bancoDeConvidados.size();
	}
}
